﻿using System;
using System.Collections.Generic;
using Jypeli;
using Jypeli.Assets;
using Jypeli.Controls;
using Jypeli.Effects;
using Jypeli.Widgets;
//CollisionIgnoreGroup: lisää tänne ryhmien määritelmät
//collisionignoregroup 1 = esteet,seinät yms.
//CollisionIgnoreGroup 2 = pelaaja, heittov 
//CollisionIgnoreGroup 3 = fakeHVeitsi


// BUGIT /TODO : 
//Heittoveitsien määrä lisääntyy, kun heittoveitsi kerätään => niitä voi saada yli 20 kpl, syytä ei tiedetä KORJAA TÄMÄ HETI KUN MAHDOLLISTA!
// ´Pahis1:n näkökentän päivitys ei toimi. TÄMÄ ON MELKO TÄRKEÄÄ KORJATA




public class Endless : PhysicsGame
{
    PhysicsObject pelaaja;//Esitellään pelaaja niin, että sitä voidaan käyttää toisesta aliohjelmasta
    int LohkojenMaara, ladattuLohko, oet;
    Timer ajastin;
    bool voiVaihtaaLohkoa, pelaajaolemassa;
    Image heittov = LoadImage("throwingknife"); // heittoveitsen kuva
    Image puhPutkiImage = LoadImage("blowpipeimage"); //puhPutkenkuva
    Image nuolikuva = LoadImage("dartimage");
    Image varJousiKuva = LoadImage("crossbowimage");//varsijousenkuva
    Image pomminKuva = LoadImage("bombimage");
    Image Taustankuva = LoadImage("background");
    Image logo = LoadImage("logo");
    Image enuolenkuva = LoadImage("earrowimage");
    Image debugkuva = LoadImage("debugtransparency");
    Image pahiksenkuva = LoadImage("pahiksenkuva");
    GameObject varsJousi;
    IntMeter laskuri;
    IntMeter hVeitsiLaskuri;
    string ase = "hveitsi"; //jotta tiedetään mikä ase käytössä
    GameObject puhPutki; //puhallusputken tekstuuri
    List<Label> valikonKohdat;
    List<Enemy> pahikset = new List<Enemy>();

    char pelaajanpaikka;//LataaLohko tarvitsee tiedon portista, jonka viereen pelaaja spawnaa
    int HeittoVeitsienMaara; //käytetään heittoveitsien määrän tallentamiseen lohkon vaihtamisen aikana
    public override void Begin()
    {
        Mouse.IsCursorVisible = true;
        pelaajanpaikka = 'l';//portti jonka vierestä aloitetaan
        HeittoVeitsienMaara = 20;
        Level.BackgroundColor = Color.Black;
        GameObject logonaytto = new GameObject(Screen.Width / 2, Screen.Height / 2);
        logonaytto.Image = logo;
        //Add(logonaytto);
        //MediaPlayer.Play("chipjungle");
        //MediaPlayer.IsRepeating = true; //turha?
        Level.BackgroundColor = Color.LightBlue;
        logonaytto.Destroy();
        Valikko();
    }
    void Valikko()
    {
        ClearAll(); // Tyhjennetään kenttä kaikista peliolioista
        pelaajaolemassa = false;
        GameObject taustakuva = new GameObject(Level.Width, Level.Height);
        taustakuva.Image = Taustankuva;

        Add(taustakuva); ;


        valikonKohdat = new List<Label>(); // Alustetaan lista, johon valikon kohdat tulevat

        Label kohta1 = new Label("Aloita uusi peli");  // Luodaan uusi Label-olio, joka toimii uuden pelin aloituskohtana
        kohta1.Position = new Vector(0, 40);  // Asetetaan valikon ensimmäinen kohta hieman kentän keskikohdan yläpuolelle
        valikonKohdat.Add(kohta1);  // Lisätään luotu valikon kohta listaan jossa kohtia säilytetään

        // Lisätään kaikki luodut kohdat peliin foreach-silmukalla
        foreach (Label valikonKohta in valikonKohdat)
        {
            Add(valikonKohta);

            if (Mouse.IsCursorOn(valikonKohta))
            {
                valikonKohta.TextColor = Color.Red;
            }
            else
            {
                valikonKohta.TextColor = Color.Black;


            }
        }

        Mouse.ListenOn(kohta1, MouseButton.Left, ButtonState.Pressed, AloitaPeli, null);
        //Mouse.ListenOn(kohta2, MouseButton.Left, ButtonState.Pressed, ParhaatPisteet, null);  //ÄLÄ POISTA SAATETAAN TARVITA TULEVAISUUDESSA
        //Mouse.ListenOn(kohta3, MouseButton.Left, ButtonState.Pressed, Exit, null);

    }
    void luolaskin()
    {
        laskuri = new IntMeter(0);

        Widget pisteRuutu = new Widget(100, 50);
        pisteRuutu.Layout = new VerticalLayout();
        pisteRuutu.X = Screen.LeftSafe + 150;
        pisteRuutu.Y = Screen.TopSafe - 100;
        pisteRuutu.Color = Color.Transparent;
        Add(pisteRuutu);

        Label pisteTeksti = new Label("Points: ");
        pisteRuutu.Add(pisteTeksti);

        Label pisteNaytto = new Label();
        pisteNaytto.BindTo(laskuri);
        pisteRuutu.Add(pisteNaytto);
    }
    void luoHVeitsilaskin()
    {
        hVeitsiLaskuri = new IntMeter(HeittoVeitsienMaara);

        Widget pisteRuutu = new Widget(100, 50);
        pisteRuutu.Layout = new VerticalLayout();
        pisteRuutu.X = Screen.RightSafe - 150;
        pisteRuutu.Y = Screen.TopSafe - 100;
        pisteRuutu.Color = Color.Transparent;
        Add(pisteRuutu);

        Label pisteTeksti = new Label("Knives left: ");
        pisteRuutu.Add(pisteTeksti);

        Label pisteNaytto = new Label();
        pisteNaytto.BindTo(hVeitsiLaskuri);
        pisteRuutu.Add(pisteNaytto);
    }
    void AloitaPeli()
    {

        LohkojenMaara = 9;//Lohkojen täytyy yhdessä muodostaa neliön muotoinen alue. KUN MAAILMAN KOKOA MUUTETAAN, tämä muuttuja TÄYTYY PÄIVITTÄÄ! Muuten LataaLohko voi ladata väärät lohkot.
        oet = 50;//oet = objektien etäisyys toisistaan
        ajastin = new Timer();
        ajastin.Interval = 3;
        ajastin.Timeout += delegate()
        {
            voiVaihtaaLohkoa = true;
            ajastin.Stop();//tekeekö reset tämän automaattisesti?
            ajastin.Reset();
        };
        LataaLohko(5);
        AsetaOhjaimet();
        luoVarsJousi();
        luoPuhPutki();
        puhPutki.Destroy();
        varsJousi.Destroy();
        ase = "tyhja";
    }
    void LuoPelaaja(double X, double Y)
    {
        pelaaja = new PhysicsObject(30, 30, Shape.Rectangle);//Neliön muotoinen pelaaja, koko 30x30
        pelaaja.Color = Color.Red;//Väliaikaisesti, pelaajalla ei ole vielä tekstuureja
        pelaaja.CanRotate = false;//Estetään pelaajan holtiton pyöriminen seinään törmätessä
        pelaaja.Restitution = 0;//Estetään pelaajan kimpoilu seinistä
        pelaaja.X = X;
        pelaaja.Y = Y;
        AddCollisionHandler(pelaaja, "left", ValitseLohko);
        AddCollisionHandler(pelaaja, "right", ValitseLohko);
        AddCollisionHandler(pelaaja, "up", ValitseLohko);
        AddCollisionHandler(pelaaja, "down", ValitseLohko);
        Camera.Follow(pelaaja);
        Add(pelaaja);//Lisätään pelaaja kentälle
        Mouse.IsCursorVisible = true;// laitetaan kursori näkymään, jotta tähtääminen toimii
        pelaaja.CollisionIgnoreGroup = 2;
        luolaskin();
        luoHVeitsilaskin();
    }
    void luoPuhPutki()
    {
        if (varsJousi.IsAddedToGame == true && varsJousi != null) varsJousi.Destroy();
        ase = "puhPutki";
        puhPutki = new GameObject(40, 5);
        puhPutki.Position = pelaaja.Position;
        puhPutki.Angle = pelaaja.Angle;
        puhPutki.Image = puhPutkiImage;
        Add(puhPutki);
    }
    void HeitaPommi()
    {
        Grenade pommi = new Grenade(10.5); //luodaan pommi
        pommi.Image = pomminKuva; //asetetaan sille tekstuurit
        pelaaja.Throw(pommi, Angle.FromDegrees(30), 1);//heitetään se
        pommi.Explosion.ShockwaveReachesObject += KranaattiOsui; //collisionhandler
    }
    void KranaattiOsui(IPhysicsObject rajahdyksenKohde, Vector v)
    {
        IPhysicsObject kohde = rajahdyksenKohde as PhysicsObject;  //muutetaan iphysicsobject phyciscsobjectiksi 
        if (kohde.Tag.ToString() == "pahis1")
        {
            kohde.Destroy(); //tuhotaan pahis tai tuhottava este
        }
        if (kohde.Tag.ToString() == "TuhEste")
        {
            kohde.Destroy();
        }

    }

    void luoVarsJousi()
    {
        if (puhPutki != null) puhPutki.Destroy();
        ase = "varsJousi";
        varsJousi = new GameObject(30, 50);
        varsJousi.Image = varJousiKuva;

        varsJousi.Position = pelaaja.Position;
        varsJousi.Angle = pelaaja.Angle;
        Add(varsJousi);
    }
    void ammuNuoli()
    {
        if (ase == "puhPutki")
        {
            PhysicsObject nuoli = new PhysicsObject(20, 7); //luodaan nuoli
            nuoli.Position = pelaaja.Position; //asetetaan paikaksi pelaaja
            nuoli.Image = nuolikuva;//lisätään tekstuuri
            nuoli.Tag = "nuoli";
            nuoli.CollisionIgnoreGroup = 2;//lisätään samaan CollisionIgnoreGroupiin pelaajan ja heittoveitsien kanssa.
            Add(nuoli);//lisätään heittoveitsi peliin
            nuoli.Angle = pelaaja.Angle; //kulmaksi pelaajan kulma
            Vector suunta = (Mouse.PositionOnWorld - pelaaja.Position).Normalize() * 500; //suuntavektori
            nuoli.Hit(suunta);//lyödään veitsi liikkeelle
            nuoli.MaximumLifetime = TimeSpan.FromSeconds(2.0);
            //AddCollisionHandler<PhysicsObject, Enemy>(nuoli, nuoliOsuiEnemyyn);// voisi kai tehdä helpomminkin
            // AddCollisionHandler(nuoli, nuoliOsuiPhysicsObjectiin);// voisi kai tehdä helpomminkin
        }
        else if (ase == "varsJousi")
        {
            PhysicsObject eNuoli = new PhysicsObject(20, 5);  //luodaan räjähtävä nuoli
            eNuoli.Position = pelaaja.Position;
            eNuoli.Tag = "eNuoli";
            eNuoli.Image = enuolenkuva;
            eNuoli.CollisionIgnoreGroup = 2;//lisätään samaan CollisionIgnoreGroupiin pelaajan ja heittoveitsien kanssa.
            Add(eNuoli);
            eNuoli.Angle = pelaaja.Angle;
            Vector suunta = (Mouse.PositionOnWorld - pelaaja.Position).Normalize() * 800; //suuntavektori
            eNuoli.Hit(suunta);//lyödään veitsi liikkeelle
            eNuoli.MaximumLifetime = TimeSpan.FromSeconds(2.0);
            AddCollisionHandler(eNuoli, eNuoliOsui);

        }
        else return;

    }
    void eNuoliOsui(PhysicsObject nuoli, PhysicsObject kohde)
    {

        Explosion rajahdys = new Explosion(55);
        rajahdys.Position = nuoli.Position;
        rajahdys.Force = 900;
        rajahdys.ShockwaveReachesObject += KranaattiOsui;
        Add(rajahdys);
        nuoli.Destroy();
    }
    void heitaVeitsi()
    {
        if (hVeitsiLaskuri.Value > 0)
        {
            HeittoVeitsienMaara--;
            hVeitsiLaskuri.Value--;
            PhysicsObject hVeitsi = new PhysicsObject(20, 5); //luodaan heittoveitsi
            hVeitsi.Position = pelaaja.Position; //asetetaan paikaksi pelaaja
            hVeitsi.Tag = "hVeitsi";
            hVeitsi.Image = heittov;//lisätään tekstuuri
            hVeitsi.CollisionIgnoreGroup = 2;

            Add(hVeitsi);//lisätään heittoveitsi peliin
            hVeitsi.Angle = pelaaja.Angle; //kulmaksi pelaajan kulma
            Vector suunta = (Mouse.PositionOnWorld - pelaaja.Position).Normalize() * 500; //suuntavektori
            hVeitsi.Hit(suunta);//lyödään veitsi liikkeelle

            AddCollisionHandler<PhysicsObject, Enemy>(hVeitsi, heittoveitsiOsuiEnemyyn);// voisi kai tehdä helpomminkin
            AddCollisionHandler(hVeitsi, heittoveitsiOsuiPhysicsObjectiin);// voisi kai tehdä helpomminkin
        }
    }
    void heittoveitsiOsuiEnemyyn(PhysicsObject hVeitsi, Enemy kohde)
    {
        if (kohde != pelaaja) //koska veitsi osuu randomisti pelaajaan heitossa, ei luultavasti enää tarvitse,koska CollisionIgnoreGroup 2
        {
            hVeitsi.Destroy();

            kohde.getelamiaJaljella.Value = kohde.getelamiaJaljella.Value - 3; //vähennetään elämiä
            if (kohde.getelamiaJaljella <= 0)//tuhotaan kohde jos elämät ovat lopussa
            {
                laskuri.Value++;
                kohde.Destroy();
            }

        }
    }
    void nuoliOsuiEnemyyn(PhysicsObject nuoli, Enemy kohde)
    {
        if (kohde != pelaaja) //koska veitsi osuu randomisti pelaajaan heitossa, ei luultavasti enää tarvitse,koska CollisionIgnoreGroup 2
        {
            nuoli.Destroy();

            kohde.getelamiaJaljella.Value = kohde.getelamiaJaljella.Value - 3; //vähennetään elämiä
            if (kohde.getelamiaJaljella <= 0)//tuhotaan kohde jos elämät ovat lopussa
            {
                laskuri.Value++;
                kohde.Destroy();
            }

        }
    }
    void heittoveitsiOsuiPhysicsObjectiin(PhysicsObject hVeitsi, PhysicsObject kohde)
    {
        if (kohde.Tag.ToString() != "pahis1")
        {
            //PhysicsObject fakeHVeitsi = new PhysicsObject(30, 7);//luodaan seinään juuttunut veitsi // tarvitaanko tätä?
            PhysicsObject fakeHVeitsi = PhysicsObject.CreateStaticObject(20, 5);
            fakeHVeitsi.Position = hVeitsi.Position;//paikka 
            fakeHVeitsi.CollisionIgnoreGroup = 3;
            fakeHVeitsi.Tag = "fakehVeitsi";
            fakeHVeitsi.Angle = hVeitsi.Angle;//kulma
            fakeHVeitsi.Image = heittov;
            hVeitsi.Destroy(); // tuhotaan hVeitsi, jolla estetään turhien veitsien kimpoileminen ympäriinsä ja resursseja säästyy
            Add(fakeHVeitsi);
            AddCollisionHandler(fakeHVeitsi, keraaveitsi);
        }
    }
    void keraaveitsi(PhysicsObject veitsi, PhysicsObject kohde)
    {
        if (veitsi.Tag.ToString() == "fakehVeitsi" && kohde == pelaaja)
        {
            HeittoVeitsienMaara++;
            hVeitsiLaskuri.Value++;
            veitsi.Destroy();
        }
    }
    void ValitseLohko(PhysicsObject pelaaja, PhysicsObject kohde)
    {
        if (voiVaihtaaLohkoa == true)
        {
            if (kohde.Tag.ToString() == "right")
            {
                pelaajanpaikka = 'l';
                LataaLohko(ladattuLohko + 1);
            }
            if (kohde.Tag.ToString() == "left")
            {
                pelaajanpaikka = 'r';
                LataaLohko(ladattuLohko - 1);
            }
            if (kohde.Tag.ToString() == "up")
            {
                pelaajanpaikka = 'd';
                LataaLohko(Convert.ToInt32(ladattuLohko - Math.Sqrt(LohkojenMaara)));
            }
            if (kohde.Tag.ToString() == "down")
            {
                pelaajanpaikka = 'u';
                LataaLohko(Convert.ToInt32(ladattuLohko + Math.Sqrt(LohkojenMaara)));
            }
        }
    }
    void LataaLohko(int ladattavaLohko)//Tämä lataa palasen kentästä
    {
        ClearGameObjects();
        voiVaihtaaLohkoa = false;//turha?
        ajastin.Stop();//tekeekö reset tämän automaattisesti? 
        ajastin.Reset();
        ajastin.Start();
        if (pelaajaolemassa == false)
        { //voisi tehdä kauniimminkin
            LuoPelaaja(-200, 0);
            pelaajaolemassa = true;
            TileMap ruudut = TileMap.FromLevelAsset(ladattavaLohko.ToString());
            ruudut.SetTileMethod('L', LuoLeft);//Left
            ruudut.SetTileMethod('R', LuoRight);//Right
            ruudut.SetTileMethod('U', LuoUp);//Up
            ruudut.SetTileMethod('D', LuoDown);//Down
            ruudut.SetTileMethod('X', LuoEste);
            ruudut.SetTileMethod('-', luoTuhottavaEste);
            ruudut.SetTileMethod('P', LuoVihollinen);
            ruudut.Execute(oet, oet);
            ladattuLohko = ladattavaLohko;
            pelaajaolemassa = true; return;
        }
        if (pelaajaolemassa == true)
        {
            pelaajaolemassa = false;
            TileMap ruudut = TileMap.FromLevelAsset(ladattavaLohko.ToString());
            ruudut.SetTileMethod('L', LuoLeft);//Left
            ruudut.SetTileMethod('R', LuoRight);//Right
            ruudut.SetTileMethod('U', LuoUp);//Up
            ruudut.SetTileMethod('D', LuoDown);//Down
            ruudut.SetTileMethod('X', LuoEste);
            ruudut.SetTileMethod('P', LuoVihollinen);
            ruudut.Execute(oet, oet);
            ladattuLohko = ladattavaLohko;
            MessageDisplay.Add(ladattavaLohko.ToString());//debug
            pelaajaolemassa = true;
        }
    }
    void LuoLeft(Vector paikka, double kokoX, double kokoY)//Portti josta siirrytään toiseen lohkoon
    {
        PhysicsObject portti = PhysicsObject.CreateStaticObject(kokoX, kokoY);
        portti.Position = paikka;
        portti.Color = Color.Red;
        portti.CollisionIgnoreGroup = 1;
        portti.Tag = "left";
        Add(portti);
        if (pelaajaolemassa == false && pelaajanpaikka == 'l') { LuoPelaaja(portti.X + 50, portti.Y); pelaajaolemassa = true; }
    }
    void LuoRight(Vector paikka, double kokoX, double kokoY)//Portti josta siirrytään toiseen lohkoon
    {
        PhysicsObject portti = PhysicsObject.CreateStaticObject(kokoX, kokoY);
        portti.Position = paikka;
        portti.Color = Color.Red;
        portti.CollisionIgnoreGroup = 1;
        portti.Tag = "right";
        Add(portti);
        if (pelaajaolemassa == false && pelaajanpaikka == 'r') { LuoPelaaja(portti.X - 50, portti.Y); pelaajaolemassa = true; }
    }
    void LuoUp(Vector paikka, double kokoX, double kokoY)//Portti josta siirrytään toiseen lohkoon
    {
        PhysicsObject portti = PhysicsObject.CreateStaticObject(kokoX, kokoY);
        portti.Position = paikka;
        portti.Color = Color.Red;
        portti.CollisionIgnoreGroup = 1;
        portti.Tag = "up";
        Add(portti);
        if (pelaajaolemassa == false && pelaajanpaikka == 'u') { LuoPelaaja(portti.X, portti.Y - 50); pelaajaolemassa = true; }
    }
    void LuoDown(Vector paikka, double kokoX, double kokoY)//Portti josta siirrytään toiseen lohkoon
    {
        PhysicsObject portti = PhysicsObject.CreateStaticObject(kokoX, kokoY);
        portti.Position = paikka;
        portti.Color = Color.Red;
        portti.CollisionIgnoreGroup = 1;
        portti.Tag = "down";
        Add(portti);
        if (pelaajaolemassa == false && pelaajanpaikka == 'd') { LuoPelaaja(portti.X, portti.Y + 50); pelaajaolemassa = true; }
    }
    void LuoEste(Vector paikka, double kokoX, double kokoY)
    {
        PhysicsObject este = PhysicsObject.CreateStaticObject(kokoX, kokoY);
        este.Position = paikka;
        este.Color = Color.Black;//Musta este
        este.CollisionIgnoreGroup = 1;//Tarvitaan että esteet eivät törmäile huomaamattomasti keskenään kuluttaen resursseja 
        Add(este);
    }

    void luoTuhottavaEste(Vector paikka, double kokoX, double kokoY)
    {
        PhysicsObject este = PhysicsObject.CreateStaticObject(kokoX, kokoY);
        este.Position = paikka;
        este.Tag = "TuhEste";
        este.Color = Color.Brown;//Ruskea este
        este.CollisionIgnoreGroup = 1;//Tarvitaan että esteet eivät törmäile huomaamattomasti keskenään kuluttaen resursseja 
        Add(este);
    }

    void AsetaOhjaimet()
    {
        Keyboard.Listen(Key.W, ButtonState.Pressed, LiikutaPelaajaa, "Move up", new Vector(0, 60));
        Keyboard.Listen(Key.A, ButtonState.Pressed, LiikutaPelaajaa, "Move left", new Vector(-60, 0));
        Keyboard.Listen(Key.S, ButtonState.Pressed, LiikutaPelaajaa, "Move down", new Vector(0, -60));
        Keyboard.Listen(Key.D, ButtonState.Pressed, LiikutaPelaajaa, "Move right", new Vector(60, 0));
        Keyboard.Listen(Key.W, ButtonState.Released, PysaytaPelaaja, null, true);
        Keyboard.Listen(Key.A, ButtonState.Released, PysaytaPelaaja, null, false);
        Keyboard.Listen(Key.S, ButtonState.Released, PysaytaPelaaja, null, true);
        Keyboard.Listen(Key.D, ButtonState.Released, PysaytaPelaaja, null, false);

        Keyboard.Listen(Key.D2, ButtonState.Pressed, luoPuhPutki, null);
        Keyboard.Listen(Key.D1, ButtonState.Pressed, luoVarsJousi, null);
        Mouse.ListenMovement(0.1, Tahtaa, "Aim");
        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, heitaVeitsi, null);
        Mouse.Listen(MouseButton.Right, ButtonState.Pressed, ammuNuoli, null);
        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Quit game");
        Keyboard.Listen(Key.G, ButtonState.Pressed, HeitaPommi, "Throw a bomb");

        Keyboard.Listen(Key.E, ButtonState.Pressed, lyo, null);


        //debug
        Keyboard.Listen(Key.C, ButtonState.Pressed, naytanaatit, null);
        Keyboard.Listen(Key.NumPad7, ButtonState.Down,hack, null);
        Keyboard.Listen(Key.Space, ButtonState.Down, heitaVeitsi, null);

    }
    void hack()
    {
        hVeitsiLaskuri.Value = hVeitsiLaskuri.Value + 100;
    }
    void lyo()
    {
        PhysicsObject lyonti = new PhysicsObject(50, 10);
        lyonti.Position = pelaaja.Position;
        lyonti.Tag = "lyonti";
        lyonti.Angle = pelaaja.Angle;
        lyonti.MaximumLifetime = TimeSpan.FromSeconds(0.5);
        Add(lyonti);
    }
    void naytanaatit()
    {
        MessageDisplay.Add("x : " + pelaaja.X.ToString() + "y : " + pelaaja.Y.ToString());
    }
    void PysaytaPelaaja(Boolean Ysuunta)
    {
        if (Ysuunta == false)
        {
            pelaaja.StopHorizontal();
        }
        if (Ysuunta == true)
        {
            pelaaja.StopVertical();
        }
    }
    void Tahtaa(AnalogState hiirenLiike)
    {
        Vector suunta = (Mouse.PositionOnWorld - pelaaja.AbsolutePosition).Normalize();
        pelaaja.Angle = suunta.Angle;
    }
    void LiikutaPelaajaa(Vector suunta)//suunta kertoo vauhdin ja suunnan johon liikutaan. 
    {
        pelaaja.Hit(suunta);
    }
    void LuoVihollinen(Vector paikka, double kokoX, double kokoY)
    {
        Enemy pahis1 = new Enemy(kokoX * 0.8, kokoY * 0.8, 3); //3. parametri on pahis1:n elämät
        pahis1.Position = paikka;
        pahis1.Tag = "pahis1";
        pahis1.Image = pahiksenkuva;
        pahikset.Add(pahis1);
        Add(pahis1);

        FollowerBrain seuraaja = new FollowerBrain(pelaaja);
        seuraaja.Speed = 50;
        seuraaja.TurnWhileMoving = true;
        
        List<Vector> reitti = new List<Vector>(); //tekoälyn reitin pisteiden koordinaatit
        reitti.Add(new Vector(pahis1.X + 15, pahis1.Y)); //nämä ovat vain testejä JA NE TULEE VAIHTAA KUN PELIN TEKEMINEN EDISTYY
        reitti.Add(new Vector(pahis1.X + 15, pahis1.Y));

        PathFollowerBrain odottaja = new PathFollowerBrain();
        odottaja.ReverseReturn = true;
        odottaja.Loop = true;
        odottaja.Path = reitti;

        pahis1.Brain = odottaja;

        AddCollisionHandler(pahis1, PahikseenOsui);

        Timer ampumisajastin = new Timer(); // käytetään ampumisen ajastamiseen
        ampumisajastin.Interval = 3.0;
        ampumisajastin.Timeout += delegate
        {
            Vector suunta = pelaaja.Position - pahis1.Position;
            if (pahis1.IsDestroyed == false && pahis1.IsAddedToGame == true && pahis1.SeesObject(pelaaja) && Math.Abs(pahis1.Angle.Radians - suunta.Angle.Radians) < Math.PI / 2 && pahis1.isPoisonend == false) // pitkä rivi jolla tarkastetaan näkeekö pahis1 pelaajaa
            {
                PhysicsObject ammus = new PhysicsObject(30, 10);
                ammus.Position = pahis1.Position;
                ammus.MaximumLifetime = TimeSpan.FromSeconds(2);
                ammus.Angle = pahis1.Angle;
                Add(ammus);
                ammus.Hit(Vector.FromLengthAndAngle(1000, pahis1.Angle));
            }
        };
        ampumisajastin.Start();

        //reittihaku

        TestiPalikka testipalikka = new TestiPalikka(10, 10);
        testipalikka.Mass = 0;
        testipalikka.Position = pahis1.Position;
        testipalikka.MaximumLifetime = TimeSpan.FromSeconds(2.0);
        
        AddCollisionHandler(testipalikka, TestiTormays);


        Timer testiajastin = new Timer(); // käytetään kulman laskemiseen tietyn ajan välein
        testiajastin.Interval = 2.0;
        testiajastin.Timeout += delegate
        {
            Angle satkulma = RandomGen.NextAngle();
            Add(testipalikka);
            Vector hitvektori = Vector.FromLengthAndAngle(500,satkulma);
            MessageDisplay.Add("Testipalikka hit : " + satkulma);
            testipalikka.Hit(hitvektori);
            
        };
        Timer tarkastin = new Timer();
        tarkastin.Interval = 2.1;
        tarkastin.Timeout += delegate
        {
            if (testipalikka.Tormasi == false)
            {
                
            }
        };
    }
    void TestiTormays(PhysicsObject Testipalikka, PhysicsObject tormaaja)
    {
        TestiPalikka testipalikka = Testipalikka as TestiPalikka; //:D 
        testipalikka.Tormasi = true;
    }

    void PahikseenOsui(PhysicsObject pahis, PhysicsObject tormaaja)
    {
        if (tormaaja.Tag.ToString() == "nuoli") //nuolen poisonefekti
        {
            tormaaja.Destroy();
            pahis.Brain = null;
            Timer pyoritin = new Timer(); //hieno nimi :D
            pyoritin.Interval = 0.25;
            pyoritin.Timeout += delegate
            {
                Enemy hahmo = pahis as Enemy;
                Angle kulma = Angle.FromDegrees(10);
                hahmo.isPoisonend = true;
                pahis.Angle = pahis.Angle + kulma;
            };
            pyoritin.Start(26);

        }
        if (tormaaja.Tag.ToString() == "lyonti")
        {
            pahis.Destroy();
        }
    }
    protected override void Update(Microsoft.Xna.Framework.GameTime gameTime) 
    {
        base.Update(gameTime);

        foreach (var pahis in pahikset)
        {
            Vector suunta = pelaaja.Position - pahis.Position;
            if (pahis.SeesObject(pelaaja) &&  Math.Abs( pahis.Angle.Radians - suunta.Angle.Radians) <Math.PI / 2 && pahis.isPoisonend == false)
            {
                FollowerBrain seuraaja = new FollowerBrain(pelaaja);
                seuraaja.Speed = 100;
                seuraaja.TurnWhileMoving = true;
                pahis.Brain = seuraaja;
            }
        }


        if (puhPutki == null || varsJousi == null) return;
        //if (varsJousi == null) return;

        if (varsJousi.IsAddedToGame == true)
        {
            varsJousi.Position = pelaaja.Position;
            varsJousi.Angle = pelaaja.Angle;
        }
        if (puhPutki.IsAddedToGame == true)
        {
            puhPutki.Position = pelaaja.Position;
            puhPutki.Angle = pelaaja.Angle;
        }
    }
}
